/**
 * @Author       : Mo 2427995270@qq.com
 * @Date         : 2022-08-09 10:05:06
 * @LastEditTime : 2025-05-28 17:43:57
 * @FilePath     : \KT-02CS-APP\apps\ver_control.c
 * @Description  : 参数版本管理
 * @Version      : V1.0
 * @History      :
 * @Note         :
 */

/***************************************Includes***********************************/
#include "ver_control.h"
#include "bsp.h"
#include "old_version_model.h"
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>

/************************************Private Macros********************************/


/**********************************Private Statement*******************************/

/**
 * @brief 更新参数
 * @note null
 */
static int32_t verc_update(ver_control_t *vct);
/**
 * @brief 出厂设置
 * @return int -1失败  0成功
 * @note null
 */
static int32_t verc_factory_reset(ver_control_t *vct);

/***********************************Public Variables*******************************/



/**********************************Private Variables*******************************/



/**********************************Public Functions********************************/

/**
 * @brief 版本控制器初始化
 * @param  vct
 * @param  at_present_ver   当前版本 新版本
 * @param  _get_version     获取上个版本号，返回 0成功 -1失败
 * @param  _set_version     设置版本号，返回 0成功 -1失败
 * @param  _update_one      升级一次版本，返回 0成功 -1失败
 * @return int 0成功 -1失败
 * @note null
 */
int32_t verc_init(ver_control_t *vct, int32_t at_present_ver,
                  int32_t (*_get_version)(void),
                  int32_t (*_set_version)(int32_t ver),
                  int32_t (*_update_one)(int32_t ver)) {

    vct->at_present_ver = at_present_ver;
    vct->_get_version = _get_version;
    vct->_set_version = _set_version;
    vct->_update_one = _update_one;

    if (vct->_get_version == NULL)
        vct->_get_version = verc_get_version_ee;
    if (vct->_set_version == NULL)
        vct->_set_version = verc_set_version_ee;
    if (vct->_update_one == NULL)
        vct->_update_one = verc_update_one_ee;
    vct->_previous_ver = vct->_get_version();
    vct->update = verc_update;
    vct->factory_reset = verc_factory_reset;

    if (vct->_previous_ver < 0)
        return -1;
    return 0;
}


/**
 * @brief 获取当前参数版本
 * @return int 小于0 获取失败
 * @note null
 */
int32_t verc_get_version_ee(void) {
    uint16_t ver = 0;
    if (bsp_fram_read(SYS_PARAM_FRAM_ADDR, &ver, sizeof(ver)) < 0)
        return -1;
    if (ver == 0xffff)
        ver = 0;
    return ver;
}
/**
 * @brief 设置版本
 * @param  version
 * @return int -1失败 0成功
 * @note null
 */
int32_t verc_set_version_ee(int32_t version) {
    if (bsp_fram_write(SYS_PARAM_FRAM_ADDR, &version, sizeof(uint16_t)) < 0)
        return -1;
    return 0;
}
/**
 * @brief 升级一次参数
 * @param  version          当前参数的版本
 * @return int 升级后的版本(当前参数+1)  -1失败
 * @note null
 */
int32_t verc_update_one_ee(int32_t version) {
    int32_t ret = 0;

    switch (version) {
    case 1:
        
        break;
    case 2:

    case 3:

        break;
    case 4:

        break;
    case 5:

        break;
    default: // 不做任何更改
        return -1;
    }
    if (ret <= 0)
        return -1;
    return 0;
}
/**********************************Private Functions*******************************/

/**
 * @brief 更新参数
 * @note null
 */
static int32_t verc_update(ver_control_t *vct) {
    int32_t ret = 0;
    int32_t version = vct->_get_version();
    if (version < 0)
        return -1;
    if (version == 0) {
        vct->factory_reset(vct);
        version = vct->_get_version();
    }
    for (int32_t i = version; i < vct->at_present_ver; i++) {
        if (vct->_update_one(i) < 0)
            return -1;
        if (vct->_set_version(i + 1) < 0)
            return -1;
    }
    return 0;
}
/**
 * @brief 出厂设置
 * @return int -1失败  0成功
 * @note null
 */
static int32_t verc_factory_reset(ver_control_t *vct) {
    // puts("fram write default!");
    int ret = bsp_fram_write(SYS_PARAM_FRAM_ADDR, (void *)&sys_param_def, sizeof(sys_param_def));
    ret = ret < 0 ? -1:0;
    return ret;
}

/* [] END OF FILE */
